package pe.com.bbva.ge.vista.vaadin.ui;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import pe.com.bbva.ge.domain.configuracion.Valor;
import pe.com.bbva.ge.domain.solicitud.DetalleMaterial;
import pe.com.bbva.ge.domain.solicitud.Solicitud;
import pe.com.bbva.ge.negocio.SolicitudNegocio;
import pe.com.bbva.ge.vista.vaadin.ui.component.ComboBoxValor;
import pe.com.bbva.ge.vista.vaadin.ui.component.TxtNumerico;
import pe.com.bbva.ge.vista.vaadin.ui.utileria.bean.PropiedadesTxtNumerico;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Item;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.Table;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property;

public class MaterialesUI extends VentanaUI implements ClickListener {

	@AutoGenerated
	private VerticalLayout mainLayout;

	//@AutoGenerated
	//private Table this.tblDetalleMateriales;

	@AutoGenerated
	private VerticalLayout lytBotonera;

	@AutoGenerated
	private Button btnAgregarMateriales;

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	/**
	 * 
	 */
	private static final long serialVersionUID = 6515455069390543275L;
	
	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	private Integer itemIdNro = 1;

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	private Solicitud solicitud;
	//private List<DetalleMaterial> listaDetalleMaterial;
	private Table tblDetalleMateriales;
	private PropiedadesTxtNumerico propTxtNDecimales;
	private PropiedadesTxtNumerico propTxtNEnteros;
	
	@Autowired
	private SolicitudNegocio gestionarSolicitudNegocio;

	/**
	 * The constructor should first build the main layout, set the
	 * composition root and then do any custom initialization.
	 *
	 * The constructor will not be automatically regenerated by the
	 * visual editor.
	 */
	
	public MaterialesUI(Solicitud solicitud, Table tblDetalleMateriales) {
		buildMainLayout();
		setCompositionRoot(mainLayout);
		
		this.solicitud = solicitud;
		//this.listaDetalleMaterial = listaDetalleMaterial;
		this.tblDetalleMateriales = tblDetalleMateriales;
	}

	@Override
	public void postConstruccion() {
		this.propTxtNDecimales = new PropiedadesTxtNumerico();
		this.propTxtNDecimales.setEsDecimal(true);
		this.propTxtNEnteros = new PropiedadesTxtNumerico();
		this.propTxtNEnteros.setEsDecimal(false);
		
		// this.tblDetalleMateriales
		this.tblDetalleMateriales.setImmediate(false);
		this.tblDetalleMateriales.setWidth("780px");
		this.tblDetalleMateriales.setHeight("300px");
		mainLayout.addComponent(this.tblDetalleMateriales);
		mainLayout.setExpandRatio(this.tblDetalleMateriales, 1.0f);		
				
		IndexedContainer container = new IndexedContainer();
		container.addContainerProperty("item", Integer.class,  null);
		container.addContainerProperty("material", ComboBoxValor.class,  null);
		container.addContainerProperty("cantidadSolicitado", TextField.class,  null);
		container.addContainerProperty("cantidadAprobado", TextField.class,  null);
		container.addContainerProperty("cantidadRecepcionado", TextField.class,  null);
		container.addContainerProperty("acciones", Button.class,  null);
		this.tblDetalleMateriales.setContainerDataSource(container);
		//this.tblDetalleMateriales.setColumnHeaderMode(Table.COLUMN_HEADER_MODE_HIDDEN);
		
		this.tblDetalleMateriales.setColumnHeader("item", "Item");
		this.tblDetalleMateriales.setColumnHeader("material", "Material a solicitar");
		this.tblDetalleMateriales.setColumnHeader("cantidadSolicitado", "Cantidad <br/> Solicitado");
		this.tblDetalleMateriales.setColumnHeader("cantidadAprobado", "Cantidad <br/> Aprobada");
		this.tblDetalleMateriales.setColumnHeader("cantidadRecepcionado", "Cantidad <br/> Recepcionado");
		this.tblDetalleMateriales.setColumnHeader("acciones", "Acciones");
		
		this.tblDetalleMateriales.setColumnWidth("item", 40);
		this.tblDetalleMateriales.setColumnWidth("material", 340);
		this.tblDetalleMateriales.setColumnWidth("cantidadSolicitado", 80);
		this.tblDetalleMateriales.setColumnWidth("cantidadAprobado", 80);
		this.tblDetalleMateriales.setColumnWidth("cantidadRecepcionado", 80);
		this.tblDetalleMateriales.setColumnWidth("acciones", 60);
		
		this.tblDetalleMateriales.setStyleName("tbl-header-multi-row");
		
		
		if(this.solicitud.getNumero() != null)
		{
			List<DetalleMaterial> listaDellateMateriales = gestionarSolicitudNegocio.obtenerDetalleMateriales(gestionarSolicitudNegocio.obtenerDestinos(this.solicitud).get(0));
			
			for(DetalleMaterial detalleMaterial : listaDellateMateriales)
			{
				Item item = container.addItem(itemIdNro);
				agregarControles(item, detalleMaterial);
				itemIdNro++;
			}
		}
		
		btnAgregarMateriales.addListener((ClickListener)this);
	}
	
	@Override
	public void buttonClick(ClickEvent event) {
		if(event.getButton().equals(btnAgregarMateriales))
		{
			agregarMaterial();
		}
		/*else if(btnAcciones.equals(event.getButton()))
		{
			
		}*/
	}
	
	private void agregarMaterial()
	{
		
		IndexedContainer container = (IndexedContainer) this.tblDetalleMateriales.getContainerDataSource();
		Item item = container.addItem(itemIdNro);
		itemIdNro++;
		
		agregarControles(item, null);
		this.tblDetalleMateriales.setContainerDataSource(container);
	}
	
	private void agregarControles(Item item, DetalleMaterial detalleMaterial)
	{
		item.getItemProperty("item").setValue(this.tblDetalleMateriales.getItemIds().size());
		
		final ComboBoxValor cmbMateriales = new ComboBoxValor("MATERIAL");
		cmbMateriales.setWidth("335");
		cmbMateriales.setData(itemIdNro);		
		
		TxtNumerico txtCantidadSolicitado = new TxtNumerico("", this.propTxtNEnteros);
		txtCantidadSolicitado.setWidth("75");
		txtCantidadSolicitado.setValue("0");
		txtCantidadSolicitado.setData(itemIdNro);
		
		TxtNumerico txtCantidadAprobado = new TxtNumerico("", this.propTxtNEnteros);
		txtCantidadAprobado.setWidth("75");
		txtCantidadAprobado.setValue("0");
		txtCantidadAprobado.setData(itemIdNro);
		
		TxtNumerico txtCantidadRecepcionado = new TxtNumerico("", this.propTxtNEnteros);
		txtCantidadRecepcionado.setWidth("75");
		txtCantidadRecepcionado.setValue("0");
		txtCantidadRecepcionado.setData(itemIdNro);
		
		final  Button btnAcciones = new Button();
		btnAcciones.setData(itemIdNro);
		btnAcciones.setCaption("X");
		
		btnAcciones.addListener(new ClickListener() {
			@Override
			public void buttonClick(ClickEvent event) {
				
				Object itemId = btnAcciones.getData();
				quitarMaterial(itemId);				
			}
		});
		
		if(detalleMaterial != null)
		{
			cmbMateriales.setValue(detalleMaterial.getTipoMaterial());
			txtCantidadSolicitado.setValue(detalleMaterial.getSolicitado());
			txtCantidadAprobado.setValue(detalleMaterial.getAprobado());
			txtCantidadRecepcionado.setValue(detalleMaterial.getRecepcionado());
		}
		
		item.getItemProperty("material").setValue(cmbMateriales);
		item.getItemProperty("cantidadSolicitado").setValue(txtCantidadSolicitado);
		item.getItemProperty("cantidadAprobado").setValue(txtCantidadAprobado);
		item.getItemProperty("cantidadRecepcionado").setValue(txtCantidadRecepcionado);
		item.getItemProperty("acciones").setValue(btnAcciones);
	}
	
//	private void agregarMaterial(Item item)
//	{
//		ComboBoxValor cmbMaterial = (ComboBoxValor) item.getItemProperty("material").getValue();
//		Valor objMaterial = cmbMaterial.obtenerValor();
//		
//		if(objMaterial != null)
//		{
////			for(DetalleMaterial detalleMaterial : this.listaDetalleMaterial)
////			{
////				if(detalleMaterial.getMaterial().equals(objMaterial))
////				{
////					
////				}
////			}
//		}
//	}
	
	private void quitarMaterial(Object itemId)
	{
		this.tblDetalleMateriales.removeItem(itemId);
		
		int i = 1;
		for (Object itemIdN : this.tblDetalleMateriales.getItemIds()) {
			Item item = this.tblDetalleMateriales.getItem(itemIdN);
			item.getItemProperty("item").setValue(i++);
		}
	}

	public Table getTblDetalleMateriales() {
		return tblDetalleMateriales;
	}

	public void setTblDetalleMateriales(Table tblDetalleMateriales) {
		this.tblDetalleMateriales = tblDetalleMateriales;
	}
	
	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("100%");
		mainLayout.setMargin(false);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("100.0%");
		
		// lytBotonera
		lytBotonera = buildLytBotonera();
		mainLayout.addComponent(lytBotonera);
		
		return mainLayout;
	}

	@AutoGenerated
	private VerticalLayout buildLytBotonera() {
		// common part: create layout
		lytBotonera = new VerticalLayout();
		lytBotonera.setImmediate(false);
		lytBotonera.setWidth("780px");
		lytBotonera.setHeight("40px");
		lytBotonera.setMargin(false);
		
		// btnAgregarMateriales
		btnAgregarMateriales = new Button();
		btnAgregarMateriales.setCaption("+ Agregar Materiales");
		btnAgregarMateriales.setImmediate(true);
		btnAgregarMateriales.setWidth("-1px");
		btnAgregarMateriales.setHeight("-1px");
		lytBotonera.addComponent(btnAgregarMateriales);
		lytBotonera.setComponentAlignment(btnAgregarMateriales, new Alignment(
				34));
		
		return lytBotonera;
	}

}
